package br.com.senac.pi.facade;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import br.com.senac.pi.dao.FabricanteDAO;
import br.com.senac.pi.dao.SorveteDAO;
import br.com.senac.pi.interfaces.PIDataObject;
import br.com.senac.pi.modelo.Fabricante;
import br.com.senac.pi.modelo.Sorvete;
import br.com.senac.pi.persistence.PersistenceModule;
import br.com.senac.pi.util.Utilidades;

public class PIPersistenceFacade {
	private PersistenceModule persistenceModule;
	
	private SorveteDAO sorveteDAO;
	private FabricanteDAO fabricanteDAO;
	
	public PIPersistenceFacade() {
		persistenceModule = new PersistenceModule();
		persistenceModule.loadBase();
		
		sorveteDAO 		= new SorveteDAO(persistenceModule);
		fabricanteDAO 	= new FabricanteDAO(persistenceModule);
	}
	
	/**
	 * Grava um fabricante no aquivo
	 * @param fabricante
	 * @throws FileNotFoundException
	 */
	public void persistFabricante(Fabricante fabricante) throws FileNotFoundException {
		fabricanteDAO.persistData(fabricante);
	}
	
	/**
	 * recupera a lista completa de fabricantes do arquivo
	 * @return
	 * @throws FileNotFoundException
	 */
	public List<Fabricante> getFabricantes() throws FileNotFoundException {
		List<Fabricante> fabricantes = fabricanteDAO.getListaCompleta();
		PIDataObject[] s = fabricantes.toArray(new Fabricante[fabricantes.size()]);
		Utilidades util = new Utilidades();
		util.ordenaItens(s, 0, fabricantes.size()-1);
		
		fabricantes = new ArrayList<Fabricante>();
		for (int i = 0; i < s.length; i++) {
			fabricantes.add((Fabricante) s[i]);
		}
		
		return fabricantes; 
	}
	
	/**
	 * Remove um fabricante do arquivo
	 * @param fabricante
	 * @throws FileNotFoundException
	 */
	public void removeFabricante(Fabricante fabricante) throws FileNotFoundException {
		fabricanteDAO.remove(fabricante);
	}
	/**
	 * Remove uma lista de fabricantes do arquivo
	 * @param fabricantes
	 * @throws FileNotFoundException
	 */
	public void removeFabricantes(List<Fabricante> fabricantes) throws FileNotFoundException {
		fabricanteDAO.remove(fabricantes);
	}
	
	/**
	 * Recupera uma lista de fabricantes iguais ao quesito de busca
	 * @param fabricante
	 * @return
	 * @throws FileNotFoundException
	 */
	public List<Fabricante> buscaFabricante(Fabricante fabricante) throws FileNotFoundException {
		return fabricanteDAO.buscaByFabricante(fabricante);
	}
	
	/**
	 * Grava um sorvete no aquivo
	 * @param sorvete
	 * @throws FileNotFoundException
	 */
	public void persistSorvete(Sorvete sorvete) throws FileNotFoundException {
		sorveteDAO.persistData(sorvete);
	}
		
	/**
	 * recupera a lista completa de sovetes do arquivo
	 * @return
	 * @throws FileNotFoundException
	 */
	public List<Sorvete> getSorvetes() throws FileNotFoundException {
		List<Sorvete> sorvetes = sorveteDAO.getListaCompleta();
		PIDataObject[] s = sorvetes.toArray(new Sorvete[sorvetes.size()]);
		Utilidades util = new Utilidades();
		util.ordenaItens(s, 0, sorvetes.size()-1);
		
		sorvetes = new ArrayList<Sorvete>();
		for (int i = 0; i < s.length; i++) {
			sorvetes.add((Sorvete) s[i]);
		}
		
		return sorvetes;
	}
	
	/**
	 * Remove um sorvete do arquivo
	 * @param sorvete
	 * @throws FileNotFoundException
	 */
	public void removeSorvete(Sorvete sorvete) throws FileNotFoundException {		
		sorveteDAO.remove(sorvete);
	}
	
	/**
	 * Remove uma lista de sorvetes do arquivo
	 * @param sorvetes
	 * @throws FileNotFoundException
	 */
	public void removeSorvetes(List<Sorvete> sorvetes) throws FileNotFoundException {
		sorveteDAO.remove(sorvetes);
	}
	
	/**
	 * Recupera uma lista de sorvetes iguais ao quesito de busca
	 * @param sorvete
	 * @return
	 * @throws FileNotFoundException
	 */
	public List<Sorvete> buscaSorvete(Sorvete sorvete) throws FileNotFoundException {
		return sorveteDAO.buscaBySorvete(sorvete);
	}
}
